<template>
  <div class="app-container">
    <el-form v-model="searchParams" label-width="100px" :inline="true">
      <el-form-item label="员工工号">
        <el-input v-model="searchParams.staffNo" size="small" placeholder="请输入员工工号" clearable/>
      </el-form-item>
      <el-form-item label="员工姓名">
        <el-input v-model="searchParams.employeeName" size="small" placeholder="请输入员工姓名" clearable/>
      </el-form-item>
      <el-form-item style="margin-left: 10px">
        <el-button type="primary" icon="el-icon-search" v-loading="loading" size="mini" @click="handleQuery">搜索
        </el-button>
        <el-button style="margin-left: 10px" icon="el-icon-refresh" size="mini" @click="reset">重置</el-button>
      </el-form-item>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button type="primary" icon="el-icon-confirm" v-loading="submitLoading" size="mini" @click="submitAssess">提交</el-button>
      </el-col>
      <el-col :span="1.5">
        <el-button type="primary" icon="el-icon-confirm" v-loading="submitLoading" size="mini" @click="submitAllAssess">全部提交</el-button>
      </el-col>
    </el-row>
    <el-table :data="showList" v-loading="loading" border :span-method="objectSpanMethod"
              @selection-change="handleSelected" highlight-current-row>
      <el-table-column type="selection" width="55" align="center"/>
      <el-table-column type="index" label="序号" align="center"/>
      <el-table-column label="员工工号" prop="staffNo"/>
      <el-table-column label="员工姓名" prop="employeeName"/>
      <el-table-column label="部门名称" prop="deptName"/>
      <el-table-column label="证书编号" prop="certNumber" show-overflow-tooltip/>
      <el-table-column label="机考分数" prop="theoryScore" :formatter="theoryScoreFormat"/>
      <el-table-column label="领导评价" prop="leadAssess">
        <template slot-scope="scope">
          <el-radio-group v-model="scope.row.leadAssess">
            <el-radio-button :label="'Y'">合格</el-radio-button>
            <el-radio-button :label="'N'">不合格</el-radio-button>
          </el-radio-group>
        </template>
      </el-table-column>
    </el-table>
    <pagination
            v-show="total>0"
            :total="total"
            :page.sync="pageParameter.page"
            :limit.sync="pageParameter.rows"
            @pagination="getList"
    />
  </div>
</template>

<script>
  import {selectExamAssessInfoById, updateExamAssessInfoBatchForLeadAssess} from "@/api/assess/examAssess"
  import {getuserCode} from "@/utils/userCode";

  export default {
    props: {
      fakeTaskParams: Object
    },
    data() {
      return {
        // 总条数
        total: 0,
        // 分页参数
        pageParameter: {
          page: 1,
          rows: 10,
        },
        // 查询参数
        searchParams: {},
        // 持续评估列表
        assessList: [],
        // 条件查询评估列表
        searchAssessList: [],
        // 实际显示数据列表
        showList: [],
        // 复选框选中项
        selected: [],
        // 查询遮罩层
        loading: false,
        // 提交遮罩层
        submitLoading: false,
        // 合并规则对象
        mergeObj: {},
        // 合并的列
        mergeCol: ['staffNo', 'employeeName']
      }
    },
    created() {
      selectExamAssessInfoById({
        assessStatus: '1',
        leadId: getuserCode()
      }).then(response => {
        this.assessList = response.responseBody
        this.assessList.forEach(item => {
          item.leadAssess = 'Y' // 默认全部合格：Y：合格，N：不合格
        })
        this.getList()
      })
    },
    methods: {

      getList() {
        this.loading = true
        let page = this.pageParameter.page
        let rows = this.pageParameter.rows
        // 标志，0：用'评估总列表'，1：用'条件查询评估列表'
        let flag = 0;
        for (let key in this.searchParams) {
          if (this.searchParams[key]) {
            flag = 1
          }
        }
        // 根据flag，选择采用对应的列表
        if (flag === 0) {
          // 排序
          this.sortByStaffNo(this.assessList)
          // 分页
          this.showList = this.assessList.slice((page - 1) * rows, page * rows)
          // 初始化合并规则
          this.getSpanArr(this.showList)
          this.total = this.assessList.length
        } else {
          // 排序
          this.sortByStaffNo(this.searchAssessList)
          // 分页
          this.showList = this.searchAssessList.slice((page - 1) * rows, page * rows)
          // 初始化合并规则
          this.getSpanArr(this.showList)
          this.total = this.searchAssessList.length
        }
        this.loading = false
      },

      handleQuery() {
        // 更新条件查询列表
        this.searchAssessList = this.query(this.searchParams, this.assessList)
        // 更新显示列表
        this.getList()
      },

      /**
       * 查询
       * searchParams：查询参数
       * list：查询的列表
       * */
      query(searchParams, list) {
        // 复制一份
        let tempList = list.slice(0)
        // 遍历查询参数
        for (let key in searchParams) {
          // 如果查询参数有值，则匹配符合条件的记录
          if (searchParams[key] && tempList) {
            let subList = new Array()
            tempList.forEach(item => {
              if (item[key].indexOf(searchParams[key]) >= 0) {
                subList.push(item)
              }
            })
            // 更新列表
            tempList = subList
          }
        }
        return tempList
      },

      reset() {
        this.searchParams = {}
        this.getList()
      },

      // 机考分数
      theoryScoreFormat(row) {
        return row.theoryScore ? row.theoryScore : 'N/A'
      },

      // 处理复选框选中项
      handleSelected(item) {
        this.selected = item
      },

      // 提交
      submitAssess() {
        if (this.selected.length === 0) {
          this.$message.error('请先选择需要处理的记录后再提交')
          return
        }
        // 记录不合格数量，Y：合格，N：不合格
        let count = 0
        this.selected.forEach(item => {
          if (item.leadAssess === 'N') {
            count++
          }
        })
        let msg = ''
        if (count > 0) {
          msg = '您提交的记录中存在' + count + '条不合格的记录，提交后将更新证书信息，确定要提交吗？'
        } else {
          msg = '提交后将更新证书信息，确定要提交吗？'
        }
        this.$confirm(msg, '警告', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.submitLoading = true
          updateExamAssessInfoBatchForLeadAssess(this.selected).then(response => {
            if (response.retCode === '200') {
              this.$message.success('更新成功！')
              // 更新列表
              this.selected.forEach(item => {
                this.remove(this.assessList, item)
              })
              // 如果剩余记录为0就关闭页面
              if(this.assessList.length === 0){
                this.$emit('cancel')
                return
              }
              this.selected = []
              this.reset()
            }
          })
        }).finally(() => {
          this.submitLoading = false
        })
      },

      // 全部提交
      submitAllAssess() {
        // 记录不合格数量
        let count = 0
        this.assessList.forEach(item => {
         if(item.leadAssess === 'N'){
           count ++
         }
        })
        let msg = ''
        if (count > 0) {
          msg = '您提交的记录中存在' + count + '条不合格的记录，提交后将更新证书信息，确定要提交吗？'
        } else {
          msg = '提交后将更新证书信息，确定要全部提交吗？'
        }
        this.$confirm(msg, '警告', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          this.submitLoading = true
          this.assessList.forEach(item => {
            item.taskId = this.fakeTaskParams.taskId
          })
          updateExamAssessInfoBatchForLeadAssess(this.assessList).then(response => {
            if (response.retCode === '200') {
              this.$message.success('更新成功！')
              this.$emit('closeFake')
            }
          })
        }).finally(() => {
          this.submitLoading = false
        })
      },

      // 删除数组指定元素
      remove(arr, item) {
        let index = -1
        for (let i = 0; i < arr.length; i++) {
          if (arr[i] === item) {
            index = i
          }
        }
        if (index > -1) {
          arr.splice(index, 1)
        }
      },

      // 根据员工工号排序
      sortByStaffNo(list) {
        if (!(list && list.length !== 0)) {
          return
        }
        let i = 1 // 当前需要交换位置下标，从第二个元素开始
        let obj = list[0].staffNo // 当前比较的元素，初值为第一个元素
        let temp // 临时变量
        while (i < list.length) {
          for (let j = i + 1; j < list.length; j++) {
            // 如果找到相等元素则交换位置
            if (obj === list[j].staffNo) {
              temp = list[i]
              list[i] = list[j]
              list[j] = temp
              // 更新交换位置
              i += 1
            }
          }
          // 更新比较元素
          obj = list[i].staffNo
          // 更新交换位置
          i += 1
        }
      },

      // 初始化合并规则
      getSpanArr(list) {
        this.mergeCol.forEach((key) => {
          let count = 0; // 用来记录需要合并行的起始位置
          this.mergeObj[key] = []; // 记录每一列的合并信息
          list.forEach((item, index) => {
            // index == 0表示数据为第一行，直接 push 一个 1
            if (index === 0) {
              this.mergeObj[key].push(1);
            } else {
              // 判断当前行是否与上一行其值相等 如果相等 在 count 记录的位置其值 +1 表示当前行需要合并 并push 一个 0 作为占位
              if (item[key] === list[index - 1][key]) {
                this.mergeObj[key][count] += 1;
                this.mergeObj[key].push(0);
              } else {
                // 如果当前行和上一行其值不相等
                count = index; // 记录当前位置
                this.mergeObj[key].push(1); // 重新push 一个 1
              }
            }
          })
        })
      },

      // 合并规则
      objectSpanMethod({row, column, rowIndex, columnIndex}) {
        // 判断列的属性
        if (this.mergeCol.indexOf(column.property) !== -1) {
          // 判断其值是不是为0
          if (this.mergeObj[column.property][rowIndex]) {
            return [this.mergeObj[column.property][rowIndex], 1]
          } else {
            // 如果为0则为需要合并的行
            return [0, 0];
          }
        }
      },

    }
  }
</script>